package oa.base.util;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.builder.ToStringBuilder;

/**
 * @author lilang
 */
public class Page<T> implements Serializable {
	private static final long serialVersionUID = 9030682628072361206L;
	public final static int DEFAULT_PAGE_SIZE = 15;// 默认每页的记录数
	private List<T> rows; // 本页包含的数据
	private int start; // 本页在数据集中的起始位置
	private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数
	private int total;// 总记录数
	private int pageNo = 0;
	
	
	
	public int getStart() {
		return start;
	}

	public void setStart(int start) {
		this.start = start;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	public void setRows(List<T> rows) {
		this.rows = rows;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	/**
	 * 构造函数 - 空页
	 */
	public Page() {
		this(new ArrayList<T>(), 0, 0, DEFAULT_PAGE_SIZE);
	}

	/**
	 * 构造函数 - 默认
	 * 
	 * @param result
	 *            本页包含的数据
	 * @param start
	 *            本页在数据集中的起始位置
	 * @param totalCount
	 *            数据库记录数
	 * @param pageSize
	 *            页容量
	 */
	public Page(List<T> results, int start, int totalCount, int pageSize) {
		if (results == null) {
			this.rows = new ArrayList<T>();
		} else if (results.size() <= pageSize) {
			this.rows = results;
		} else {
			this.rows = new ArrayList<T>();
			for (int i = start; (i < start + pageSize) && (i < results.size()); i++)
				this.rows.add(results.get(i));
		}
		this.start = start;
		this.pageSize = (pageSize > 0) ? pageSize : DEFAULT_PAGE_SIZE;
		this.total = totalCount;
	}

	/**
	 * 当前页
	 */
	public int getCurrentPageNo() {
		this.pageNo = start / pageSize + 1;
		return this.pageNo;
	}

	/**
	 * 获取最大页/总页数
	 */
	public int getLastPageNo() {
		return (total + pageSize - 1) / pageSize;
	}

	/**
	 * 当前页记录
	 */
	public List<T> getRows() {
		return rows;
	}

	/**
	 * 取数据库中包含的总记录数
	 */
	public int getTotal() {
		return total;
	}

	/**
	 * 判断是否有下一页
	 */
	public boolean hasNextPage() {
		return getCurrentPageNo() < getLastPageNo();
	}

	/**
	 * 判断是否有前一页
	 */
	public boolean hasPrevPage() {
		return getCurrentPageNo() > 1;
	}

	/**
	 * 获取指定页在数据集中的起始位置,每页条数使用默认值(从0开始)
	 */
	public static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
	}

	/**
	 * 获取指定页在数据集中的起始位置(从0开始)
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return Math.max((pageNo - 1) * pageSize, 0);
	}

	/**
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return new ToStringBuilder(this)
				.append("total", this.getTotal())
				.append("currentPageNo", this.getCurrentPageNo())
				.append("lastPageNo", this.getLastPageNo())
				.append("rows", this.getRows()).toString();
	}

}
